package com.zhangjingcheng.yunyixia.controller;

import com.zhangjingcheng.yunyixia.pojo.dto.LoadFileListDTO;
import com.zhangjingcheng.yunyixia.pojo.dto.RenameDTO;
import com.zhangjingcheng.yunyixia.pojo.dto.UploadDTO;
import com.zhangjingcheng.yunyixia.pojo.vo.FileVO;
import com.zhangjingcheng.yunyixia.pojo.vo.UploadVO;
import com.zhangjingcheng.yunyixia.result.PageResult;
import com.zhangjingcheng.yunyixia.result.Result;
import com.zhangjingcheng.yunyixia.service.FileService;
import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
    @Autowired
    private FileService fileService;

    /**
     * S3文件上传
     *
     * @param file
     * @return
     */
    @ApiOperation("S3文件上传")
    @PostMapping("/s3Upload")
    public Result<String> s3Upload(@RequestPart("file") MultipartFile file) {
        log.info("开始文件上传：{}", file.getOriginalFilename());
        return Result.success(fileService.s3Upload(file));
    }

    /**
     * 加载文件列表
     *
     * @param dto
     * @return
     */
    @ApiOperation("加载文件列表")
    @GetMapping("/list")
    public Result<PageResult<FileVO>> list(LoadFileListDTO dto) {
        log.info("开始加载文件列表：{}", dto);
        PageResult<FileVO> pageResult = fileService.list(dto);
        log.info("加载文件列表成功：{}", pageResult);
        return Result.success(pageResult);
    }

    /**
     * 上传文件
     *
     * @param dto
     * @return
     */
    @ApiOperation("上传文件")
    @PostMapping("/upload")
    public Result<UploadVO> upload(UploadDTO dto) {
        log.info("开始上传文件：{}", dto);
        return Result.success(fileService.upload(dto));
    }

    /**
     * 获取图片
     *
     * @param id
     * @return
     */
    @ApiOperation("获取图片")
    @GetMapping("/getImage/{id}")
    public void getImage(@PathVariable Integer id, HttpServletResponse response) {
        log.info("开始获取图片：{}", id);
        fileService.getImage(id, response);
    }

    /**
     * 文件重命名
     *
     * @param dto
     * @return
     */
    @ApiOperation("文件重命名")
    @PatchMapping("/rename")
    public Result<String> rename(@RequestBody RenameDTO dto) {
        log.info("开始文件重命名：{}", dto);
        fileService.rename(dto);
        return Result.success();
    }


    /**
     * 删除文件
     *
     * @param ids
     * @return
     */
    @ApiOperation("删除文件")//送入回收站
    @PatchMapping("/delFile")
    public Result<String> delFile(@RequestBody List<Integer> ids) {
        log.info("开始删除文件：{}", ids);
        fileService.updateFlag(ids);
        return Result.success();
    }

    /**
     * 下载文件到浏览器
     *
     * @param id
     * @param response
     */
    @ApiOperation("下载文件到浏览器")
    @GetMapping("/download/{id}")
    public void download(@PathVariable Integer id, HttpServletResponse response) {
        log.info("开始下载文件：{}", id);
        fileService.download(id, response);
    }




}
